package com.project.srtp.secure.controller;

import com.project.srtp.secure.common.result.Result;
import com.project.srtp.secure.common.result.Results;
import com.project.srtp.secure.dto.req.*;
import com.project.srtp.secure.dto.resp.GetDecryptionSenderKeyRespDTO;
import com.project.srtp.secure.dto.resp.HasPreKeyRespDTO;
import com.project.srtp.secure.dto.resp.InitKeyRespDTO;
import com.project.srtp.secure.dto.resp.PreKeyBundleRespDTO;
import com.project.srtp.secure.service.KeyStoreService;
import com.project.srtp.secure.service.PreKeyService;
import com.project.srtp.secure.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 曹行阳
 * @version 0.1
 * @date 2025/6/15 17:39
 */
@RestController
@RequiredArgsConstructor
public class KeyStoreController {

    private final KeyStoreService keyStoreService; // 密钥存储核心服务
    private final PreKeyService preKeyService;    // 预共享密钥服务

    /**
     * 存储初始化密钥
     * @param request 包含初始化密钥数据的请求体
     * @return 空结果的成功响应
     */
    @PostMapping("/api/keys/storeInitKey")
    public Result<Void> storeInitKey(@RequestBody InitKeyReqDTO request) {
        keyStoreService.storeInitKey(request); // 调用服务层存储初始化密钥
        return Results.success(); // 返回操作成功响应
    }

    /**
     * 获取所有初始化密钥
     * @return 包含初始化密钥集合的成功响应
     */
    @GetMapping("/api/keys/fetchInitKeys")
    public Result<InitKeyRespDTO> fetchInitKeys() {
        return Results.success(keyStoreService.fetchInitKeys()); // 获取并返回初始化密钥列表
    }

    /**
     * 获取预共享密钥包
     * @param fetchPreKeyReqDTO 包含目标用户信息的请求体
     * @return 包含预共享密钥包的成功响应
     */
    @PostMapping("/api/keys/fetchPreKeyBundle")
    public Result<PreKeyBundleRespDTO> fetchPreKeyBundle(@RequestBody FetchPreKeyReqDTO fetchPreKeyReqDTO) {
        return Results.success(keyStoreService.fetchPreKeyBundle(fetchPreKeyReqDTO)); // 获取指定用户的预共享密钥包
    }

    /**
     * 检查用户是否存在预共享密钥
     * @param request 包含用户ID的请求体
     * @return 包含检查结果的成功响应
     */
    @PostMapping("/api/keys/hasPreKey")
    public Result<HasPreKeyRespDTO> hasPreKey(@RequestBody HasPreKeyReqDTO request) {
        return Results.success(preKeyService.hasPreKey(request.getUserId())); // 验证用户是否拥有预共享密钥
    }

    /**
     * 为用户存储多个预共享密钥
     * @param request 包含用户ID和预共享密钥列表的请求体
     * @return 空结果的成功响应
     */
    @PostMapping("/api/keys/storePreKeys")
    public Result<Void> storePreKeys(@RequestBody PreKeyWithUserIdReqDTO request) {
        List<PreKeyReqDTO> list = request.getPreKeyReqs();
        String userId = request.getUserId();
        preKeyService.storePreKeys(list, userId); // 批量存储预共享密钥
        return Results.success();
    }

    /**
     * 存储加密用的发送方密钥
     * @param request 包含发送方密钥信息的请求体
     * @return 空结果的成功响应
     */
    @PostMapping("/api/keys/storeEncryptionSenderKey")
    public Result<Void> storeEncryptionSenderKey(@RequestBody EncryptionSenderKeyReqDTO request) {
        keyStoreService.storeEncryptionSenderKey(request); // 存储用于加密的发送方密钥
        return Results.success();
    }

    /**
     * 获取用户的身份密钥ID
     * @param request 包含用户ID的请求体
     * @return 包含身份密钥ID的成功响应
     */
    @PostMapping("/api/keys/getIdentityKeyIdByUserId")
    public Result<Integer> getIdentityKeyIdByUserId(@RequestBody IdentityKeyIdByUserIdReqDTO request) {
        return Results.success(keyStoreService.getIdentityKeyIdByUserId(request)); // 查询用户的身份密钥ID
    }

    /**
     * 检查是否存在解密用的发送方密钥
     * @param request 包含会话标识信息的请求体
     * @return 包含检查结果（布尔值）的成功响应
     */
    @PostMapping("/api/keys/hasDecryptionSenderKey")
    public Result<Boolean> hasDecryptionSenderKey(@RequestBody HasDecryptionSenderKeyReqDTO request) {
        return Results.success(keyStoreService.hasDecryptionSenderKey(request)); // 验证是否存在解密密钥
    }

    /**
     * 获取解密用的发送方密钥
     * @param request 包含会话标识信息的请求体
     * @return 包含解密密钥的成功响应
     */
    @PostMapping("/api/keys/getDecryptionSenderKey")
    public Result<GetDecryptionSenderKeyRespDTO> getDecryptionSenderKey(@RequestBody getDecryptionSenderKeyReqDTO request) {
        return Results.success(keyStoreService.getDecryptionSenderKey(request)); // 获取用于解密的发送方密钥
    }

    /**
     * 存储解密用的发送方密钥
     * @param request 包含解密密钥信息的请求体
     * @return 空结果的成功响应
     */
    @PostMapping("/api/keys/storeDecryptionSenderKey")
    public Result<Void> storeDecryptionSenderKey(@RequestBody StoreDecryptionSenderKeyReqDTO request) {
        keyStoreService.storeDecryptionSenderKey(request); // 存储接收方解密密钥
        return Results.success();
    }
}
